package com.lyw.i04collectionProblem.lock;

import java.util.concurrent.TimeUnit;

/**
 * @author lyw
 * @Date 2023/7/10-上午9:42
 */
class Phone {
  public static synchronized void sendSMS() throws InterruptedException {
    // 停留 4 秒
    TimeUnit.SECONDS.sleep(4);
    System.out.println("-------------- send SMS");
  }
  public synchronized void sendEmail() {
    System.out.println("-------------- send EMAIL");
  }
  public void getAll() {
    System.out.println("-------------- get hello");
  }
}
public class lock_8 {
  /*
  1、(不加静态锁的时候)每个线程中各调用了 phone.sendSMS(); 和 phone.sendEmail(); 其中一个， 打印的结果是
  phone.sendSMS() 先抢到锁，然后停留 4s，之后执行代码，然后释放锁，最终打印 phone.sendEmail(); 信息

  2、(不加静态锁的时候)现在有两部手机，线程1调用 短信， 线程2 调用邮箱， 因为现在是两把锁， 所以先执行邮件，然后执行短信

  3、两个方法都加上了 static 修饰方法，这时候调用一个手机的两个同步方法，因为是静态锁每个类只有一个所以先调用先执行

  4、两个方法都加上了 static 修饰方法，这时候调用两个手机的两个同步方法，因为是静态锁每个类只有一个所以先调用先执行

  5、短信静态方法，另一个普通锁方法，一部手机这时候两把锁，一个对象锁，一个类锁，同时执行

  6、邮箱静态方法，另一个普通锁方法，一部手机这时候两把锁，一个对象锁，一个类锁，同时执行
   */
  public static void main(String[] args) throws InterruptedException {
    Phone phone = new Phone();
    Phone phone1 = new Phone();

    new Thread(() -> {
      try {
        phone.sendSMS();
      } catch (Exception e) {
        e.printStackTrace();
      }
    },"AA").start();

    Thread.sleep(100);

    new Thread(() -> {
      try {
//        phone.sendEmail();
//        phone.getAll();
        phone1.sendEmail();
      } catch (Exception e) {
        e.printStackTrace();
      }
    },"BB").start();
  }
}
